package com_1;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/*
需求；1.调用方法Method 1,Method2,Method3,Function方法，并进行赋值操作
 */
public class ReflectDemo5 {//定义一个反射测试类

    public static void main(String[] args) throws Exception {//main方法入口并抛出异常
        Class<?> c = Class.forName("com.Student");//获取类的class文件对象
        Constructor<?> cs = c.getConstructor();//获取类中无参数构造方法
        cs.setAccessible(true);//暴力反射取消私有访问权限
        Object o = cs.newInstance();//获取对象
        Method m1 = c.getMethod("Method1");//通过getMethod 方法获取单个公共方法
        m1.invoke(o);//会用invoke方法进行调用
        System.out.println("--------");//分隔符
        Method m2 = c.getMethod("Method2", String.class);
        //通过class对象使用getMethod方法获取单个公共方法，第二个参数是参数的class文件
        m2.invoke(o,"曹操");//调用invoke方法
        System.out.println("----------");//分隔符
        Method m3 = c.getMethod("Method3", String.class, int.class, int.class);
        //通过class 文件对象调用getMethod方法获取单个公共方法，有三个参数，需使用参数的class文件
        Object object = m3.invoke(o, "诸葛亮", 25, 46);
        //使用方法对象调用invoke方法进行调用方法，并给参数进行赋值，并且此方法有返回值
        System.out.println(object);//输出返回的对象
        System.out.println("-----------");//分隔符
        Method m4 = c.getDeclaredMethod("Function");
        //通过类的class文件对象调用getdeclaredMethod方法获取单个私有方法
        m4.setAccessible(true);//暴力反射取消私有方法访问权限
        m4.invoke(o);//使用获得的方法对象invoke方法进行调用，无参数，无返回值
    }
}
